Virtual machine systems can suffer from poor performance with respect to input/output (I/O) functions because in a completely virtualized system, every I/O operation is typically handled indirectly by a hypervisor, a host operating system or by a separate virtual machine executing on the machine, thus increasing the costs of executing the I/O functions. One way to mitigate such performance issues is by allowing a virtual machine to take direct control of some of the physical hardware resources in the system. However, providing such direct control may have the effect of rendering the virtual machine incompletely virtualized, and many of the features associated with virtualization (saving, migrating, snap-shotting, etc.) may become difficult to accomplish.
Another way to address such I/O performance issues is to create multiple paths to an I/O device, wherein one path may travel directly to the hardware, and another path may travel indirectly to the hardware via another virtual machine. When it is desired to fully encapsulate a virtual machine's state so that it can be saved or migrated, the direct path may be torn down and the indirect path may be used. One problem with creating multiple paths is that it is typically difficult to set up a second path without giving control of the device to the second path as part of the setup process. If the I/O device is used for paging code or data and control of the paging device is passed to the second path before it is completely operational, paging may stop and cause the system to crash.
Accordingly, other techniques are needed in the art to solve the above described problems.